package com.loveto.service;

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.channels.FileChannel;

import org.json.JSONException;
import org.json.JSONObject;

import com.loveto.common.ImageDownloader;
import com.loveto.common.JsonUtils;
import com.loveto.constant.LovetoConstant;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.provider.MediaStore;
import android.provider.MediaStore.Images;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class UserinfoViewAlbumMineActivity extends BaseActivity implements
View.OnClickListener{
	
	// 사용하는 변수들
	private SharedPreferences pref;
	private Editor editor;
	private ProgressDialog progressDialog;
	private Handler myHandler = new Handler();	
	private Intent intentMoveToPage;
	private ImageView v_photo_01;
	private ImageView v_photo_02;
	private ImageView v_photo_03;
	private ImageView v_photo_04;
	private TextView v_btn_change_photo_01;
	private TextView v_btn_change_photo_02;
	private TextView v_btn_change_photo_03;
	private TextView v_btn_change_photo_04;
	private static final int PICK_FROM_CAMERA = 0;
	private static final int PICK_FROM_ALBUM = 1;
	private static final int CROP_FROM_CAMERA = 2;
	private Uri mImageCaptureUri;
	private int editingPhotoNum;
	private String memberid;
	private String phone_uid;
	private File tempPhoto;
	private File tempBigPhoto;
	private File tempThumbPhoto;
	
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.loveto_userinfo_view_album_mine);
		
		Log.d("tag","앨범수정시작");
		//변수 선언
		progressDialog = new ProgressDialog(this);
		v_photo_01 = (ImageView)findViewById(R.id.photo_01);
		v_photo_02 = (ImageView)findViewById(R.id.photo_02);
		v_photo_03 = (ImageView)findViewById(R.id.photo_03);
		v_photo_04 = (ImageView)findViewById(R.id.photo_04);
		v_btn_change_photo_01 = (TextView)findViewById(R.id.btn_change_photo_01);
		v_btn_change_photo_02 = (TextView)findViewById(R.id.btn_change_photo_02);
		v_btn_change_photo_03 = (TextView)findViewById(R.id.btn_change_photo_03);
		v_btn_change_photo_04 = (TextView)findViewById(R.id.btn_change_photo_04);
		tempPhoto = new File(Environment.getExternalStorageDirectory(), "photo_from_album.jpg");
		tempBigPhoto = new File(Environment.getExternalStorageDirectory(), "loveto_big_photo.jpg");
		tempThumbPhoto = new File(Environment.getExternalStorageDirectory(), "loveto_thumb.jpg");
		
		//로컬에서 정보 받아오기
		pref = getSharedPreferences("userInfo", Activity.MODE_PRIVATE);
		editor = pref.edit();
		memberid = pref.getString("memberid", "");
		phone_uid = pref.getString("phone_uid", "");
		editingPhotoNum = pref.getInt("present_edit_photo", 1); //사진 촬영 및 앨범 선택 시 작동 오류로 Oncreate 가 다시 호출 될 때 값을 다시 받아옴. 
		
		// 클릭 리스너 달기 // 버튼
		RelativeLayout v_btn_goto_back = (RelativeLayout)findViewById(R.id.btn_goto_back);
		v_btn_goto_back.setOnClickListener(this);
		v_btn_change_photo_01.setOnClickListener(this);
		v_btn_change_photo_02.setOnClickListener(this);
		v_btn_change_photo_03.setOnClickListener(this);
		v_btn_change_photo_04.setOnClickListener(this);
		v_photo_01.setOnClickListener(this);
		v_photo_02.setOnClickListener(this);
		v_photo_03.setOnClickListener(this);
		v_photo_04.setOnClickListener(this);
		
		//시작 시 서버에서 사진 받아오기 
		if (isNetworkAvailableAndNotice()) {
			getPhotoFromServer();
		}
	}
	
	@Override
	public void onClick(View v) {
		switch(v.getId()) {
		case R.id.btn_change_photo_01:
			editingPhotoNum = 1;
			editor.putInt("present_edit_photo", 1); //기기 오동작으로 Oncreate 가 다시 호출 될 때 Onclick 으로 다시 안오기 때문에 안전장치임.
			editor.commit();
			showGetPhotoDialog();
			break;
		case R.id.btn_change_photo_02:
			editingPhotoNum = 2;
			editor.putInt("present_edit_photo", 2); //기기 오동작으로 Oncreate 가 다시 호출 될 때 Onclick 으로 다시 안오기 때문에 안전장치임.
			editor.commit();
			showGetPhotoDialog();
			break;
		case R.id.btn_change_photo_03:
			editingPhotoNum = 3;
			editor.putInt("present_edit_photo", 3); //기기 오동작으로 Oncreate 가 다시 호출 될 때 Onclick 으로 다시 안오기 때문에 안전장치임.
			editor.commit();
			showGetPhotoDialog();
			break;
		case R.id.btn_change_photo_04:
			editingPhotoNum = 4;
			editor.putInt("present_edit_photo", 4); //기기 오동작으로 Oncreate 가 다시 호출 될 때 Onclick 으로 다시 안오기 때문에 안전장치임.
			editor.commit();
			showGetPhotoDialog();
			break;
		case R.id.photo_01:
			String photo_url1_yn = pref.getString("photo_url1", "");
			if ("Y".equals(photo_url1_yn)) {
				//사진 보러가기
				intentMoveToPage = new Intent(UserinfoViewAlbumMineActivity.this,UserinfoViewPhotoActivity.class);
				intentMoveToPage.putExtra("memberid", memberid);
				intentMoveToPage.putExtra("photonum", 1);
				startActivity(intentMoveToPage);
			} else {
				//사진 등록
				editingPhotoNum = 1;
				editor.putInt("present_edit_photo", 1); //기기 오동작으로 Oncreate 가 다시 호출 될 때 Onclick 으로 다시 안오기 때문에 안전장치임.
				editor.commit();
				showGetPhotoDialog();
			}
			break;
		case R.id.photo_02:
			String photo_url2_yn = pref.getString("photo_url2", "");
			if ("Y".equals(photo_url2_yn)) {
				//사진 보러가기
				intentMoveToPage = new Intent(UserinfoViewAlbumMineActivity.this,UserinfoViewPhotoActivity.class);
				intentMoveToPage.putExtra("memberid", memberid);
				intentMoveToPage.putExtra("photonum", 2);
				startActivity(intentMoveToPage);
			} else {
				//사진 등록
				editingPhotoNum = 2;
				editor.putInt("present_edit_photo", 2); //기기 오동작으로 Oncreate 가 다시 호출 될 때 Onclick 으로 다시 안오기 때문에 안전장치임.
				editor.commit();
				showGetPhotoDialog();
			}
			break;
		case R.id.photo_03:
			String photo_url3_yn = pref.getString("photo_url3", "");
			if ("Y".equals(photo_url3_yn)) {
				//사진 보러가기
				intentMoveToPage = new Intent(UserinfoViewAlbumMineActivity.this,UserinfoViewPhotoActivity.class);
				intentMoveToPage.putExtra("memberid", memberid);
				intentMoveToPage.putExtra("photonum", 3);
				startActivity(intentMoveToPage);
			} else {
				//사진 등록
				editingPhotoNum = 3;
				editor.putInt("present_edit_photo", 3); //기기 오동작으로 Oncreate 가 다시 호출 될 때 Onclick 으로 다시 안오기 때문에 안전장치임.
				editor.commit();
				showGetPhotoDialog();
			}
			break;
		case R.id.photo_04:
			String photo_url4_yn = pref.getString("photo_url4", "");
			if ("Y".equals(photo_url4_yn)) {
				//사진 보러가기
				intentMoveToPage = new Intent(UserinfoViewAlbumMineActivity.this,UserinfoViewPhotoActivity.class);
				intentMoveToPage.putExtra("memberid", memberid);
				intentMoveToPage.putExtra("photonum", 4);
				startActivity(intentMoveToPage);
			} else {
				//사진 등록
				editingPhotoNum = 4;
				editor.putInt("present_edit_photo", 4); //기기 오동작으로 Oncreate 가 다시 호출 될 때 Onclick 으로 다시 안오기 때문에 안전장치임.
				editor.commit();
				showGetPhotoDialog();
			}
			break;
		case R.id.btn_goto_back:
			finish();
			break;
		}
	}
	
	  private void doTakePhotoAction()
	  {
	    /*
	     * 참고 해볼곳
			http://blog.naver.com/PostView.nhn?blogId=legendx&logNo=40132435162 카메라 연동 , 자르기
			http://theeye.pe.kr/entry/example-of-image-crop-with-camera-and-album-picker-on-android
			http://susemi99.tistory.com/887 앨범에서 사진 받아오기
	     * http://2009.hfoss.org/Tutorial:Camera_and_Gallery_Demo
	     * http://stackoverflow.com/questions/1050297/how-to-get-the-url-of-the-captured-image
	     * http://www.damonkohler.com/2009/02/android-recipes.html
	     * http://www.firstclown.us/tag/android/
	     */

	    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
	    // 특정기기에서 사진을 저장못하는 문제가 있어 다음을 주석처리 합니다.
	    //intent.putExtra("return-data", true);
	    startActivityForResult(intent, PICK_FROM_CAMERA);
	  }
	  
	  /**
	   * 앨범에서 이미지 가져오기
	   */
	  private void doTakeAlbumAction()
	  {
	    // 앨범 호출
	    Intent intent = new Intent(Intent.ACTION_PICK);
	    intent.setType(android.provider.MediaStore.Images.Media.CONTENT_TYPE);
	    startActivityForResult(intent, PICK_FROM_ALBUM);
	  }

	  @Override
	  protected void onActivityResult(int requestCode, int resultCode, Intent data)
	  {
		  
		Intent intent;
	    File toFile = null; // 임시파일을 복사할 경로를 지정하기 위해 선언
	    File fromFile = null; // 불러올 파일의 경로를 저장하기 위해 선언
	    // 임시파일을 복사할 때 원본 파일을 읽어오기 위해 선언
	    FileInputStream inputStream = null;
	    // 임시파일을 복사할 때 원본 파일을 임시파일에 쓰기 위해 선언
	    FileOutputStream outputStream = null;// 여기서 아까 인텐트를 부를 때 보냈던 상수가 requestCode에 실려 되돌아온다.
		  
	    if(resultCode != RESULT_OK)
	    {
	      return;
	    }

	    switch(requestCode)
	    {

	    	case CROP_FROM_CAMERA:
	      {  
	        
    	    if (resultCode == RESULT_OK) {
    	    	Log.d("tag","이미지 반영 성공 후 업로드 시작");
    	    	if (mImageCaptureUri == null) {
    	    		Log.d("tag","사진 Uri 가져오기 실패!"); //가끔 기계가 오동작으로 Uri 를 가져오지 못할때가 있음. intent 이동 시 문제가 생기는 것으로 보임.
    	    		return;
    	    	}
    	    	Log.d("tag", "원본 path is: " + mImageCaptureUri.getPath());
				progressDialog.setMessage("서버에 저장하고 있습니다.");
				progressDialog.show();
				//크롭 후 파일 사이즈 구하기
				File cropedFile = new File(mImageCaptureUri.getPath());
				Log.d("tag","크롭 후 파일사이즈:" + cropedFile.length());
				//큰 이미지 송신
				StringBuffer sb = new StringBuffer();
				sb.append("?memberid=");
				try {
					sb.append(URLEncoder.encode(memberid, "utf-8"));
				} catch (UnsupportedEncodingException e) {
					viewToast("사진 파일 인코딩중 문제가 발생하였습니다.");
					return;
				}
				sb.append("&photo_num="); 
				sb.append(editingPhotoNum);
				sb.append("&phone_uid="); 
				sb.append(phone_uid);
				Log.d("tag","sb:" + sb.toString());
				if (cropedFile.length() > 300000) { //300 kb 가 넘으면 압축을 한 번 함.
					BitmapFactory.Options optionsBig = new BitmapFactory.Options();
					optionsBig.inSampleSize = 4; //http://shinluckyarchive.tistory.com/469  참고
    	    		Bitmap photo = BitmapFactory.decodeFile(mImageCaptureUri.getPath(),optionsBig);
    	    		int height = photo.getHeight();
    	    		int width = photo.getWidth();
    	    		int maxWidth = 800;
    	    		int toHeight = height*(maxWidth/width); //가로 800 기준으로 세로 사이즈 맞춰줌.
    	    		Bitmap resizedBig = Bitmap.createScaledBitmap(photo, maxWidth, toHeight, true);
    	    		SaveBitmapToFileCache(resizedBig, tempBigPhoto.getPath(),70); //파일이 임시로 저장 될 주소
    	    		HttpFileUpload(LovetoConstant.USERINFO_UPLOAD_PHOTO + sb.toString(),"",tempBigPhoto.getPath());
    	    		Log.d("tag","크기 수정 된 이미지송신시작");
				} else {
					//300kb 미만일 때는 원본을 바로 보냄.
					HttpFileUpload(LovetoConstant.USERINFO_UPLOAD_PHOTO + sb.toString(),"",mImageCaptureUri.getPath());
				}
				
/*    	    	//썸네일 이미지 송신
    	    	if (editingPhotoNum ==1 ) { //1번 사진(기본사진) 변경시에만 썸네일도 등록함.
    	    		BitmapFactory.Options options = new BitmapFactory.Options();
    	    		options.inSampleSize = 4; //http://shinluckyarchive.tistory.com/469  참고
    	    		Bitmap photo = BitmapFactory.decodeFile(mImageCaptureUri.getPath(),options);
    	    		Bitmap resized = Bitmap.createScaledBitmap(photo, 100, 100, true);
    	    		SaveBitmapToFileCache(resized, tempThumbPhoto.getPath(),100); //썸네일이 임시로 저장 될 주소
    	    		Log.d("tag","썸네일이미지송신시작");
    	    		// StringBuffer 초기화
    	    		sb.setLength(0);
    	    		sb.append("?memberid=");
    	    		sb.append(memberid);
    	    		Log.d("tag","sb:" + sb.toString());
    	    		HttpFileUpload(LovetoConstant.USERINFO_UPLOAD_THUMB + sb.toString(),"",tempThumbPhoto.getPath());
    	    	}*/
				
    	    	//updatePhotoYnFromDB 함수 호출로 DB에 파일 유무를 Y로 업데이트
    	    	if (updatePhotoYnFromDB(editingPhotoNum)) {
    	    		//재 다운로드 없이 바로 뷰에 적용.
    	    		setPhotoScreenDirect(editingPhotoNum,mImageCaptureUri);
    	    	}
    	    	//업로드 성공 시 뷰에는 바로 넣어줌. 다운로드 없이.
    	    	progressDialog.dismiss();
    	    }
    	    else {
    	        if (mImageCaptureUri != null) {
    	            File f = new File(mImageCaptureUri.getPath());
    	            if (f.exists()) {
    	                f.delete();
    	            }
    	        }
    	    }
	        // 임시 파일 삭제
	        File f = new File(mImageCaptureUri.getPath());  //앨범 시 사용한 사진 삭제.
	        if(f.exists())
	        {
	          f.delete();
	        }
	        // 임시 파일 삭제
	        File fb = new File(tempBigPhoto.getPath());  //카메라촬영 시 한번더 압축한 사진 삭제.
	        if(fb.exists())
	        {
	        	fb.delete();
	        }
	        // 썸네일 파일 삭제
	        File tf = new File(tempThumbPhoto.getPath()); //썸네일을 만들기 위해 만들어진 이미지
	        if(tf.exists())
	        {
	        	tf.delete();
	        }
	        break;
	      }
	  
	      case PICK_FROM_ALBUM:
	      {
	    	Log.d("tag" , "Start PICK_FROM_ALBUM");
	          if (resultCode == RESULT_CANCELED) {
	        	  Log.d("tag" , "사진 가져오기 예기치않은 종료!");
	        	  return; 
	          }
	    	//mImageCaptureUri = data.getData();
	    	Bitmap photo=null;
	         mImageCaptureUri = data.getData(); // 갤러리에서 선택된 사진의 Uri 리턴
	         try {
	          photo = Images.Media.getBitmap(getContentResolver(), mImageCaptureUri); // Uri로 이미지 가져오기
	          Log.d("tag", "PICK_FROM_ALBUM : " + photo.getHeight()*photo.getWidth()); // 확인코드
	         } catch(Exception e) {Log.e("tag", "PICK_FROM_ALBUM : " + e.toString());} 
	        Log.d("tag" , "PICK_FROM_ALBUM > 1");
	        if(photo != null)
	         try {
	        	//FileOutputStream fos = new FileOutputStream("/mnt/sdcard/photo_from_album.jpg");
	        	FileOutputStream fos = new FileOutputStream(tempPhoto);
				photo.compress(CompressFormat.JPEG, 100, fos); // 이미지 저장
				fos.flush();
				fos.close();
	         } catch(Exception e) {Log.e("tag", "" + requestCode + " : " + e.toString());}
	        else {
	         Log.e("tag", "Bitmap is null"); // 에러처리
	         return;
	        }
	        Log.d("tag" , "PICK_FROM_ALBUM > 2");
	        mImageCaptureUri = Uri.fromFile(tempPhoto);
	        Log.d("tag" , "PICK_FROM_ALBUM > 3");
			intent = new Intent("com.android.camera.action.CROP");
			intent.setDataAndType(mImageCaptureUri, "image/*");
			intent.putExtra("scale", true);
			Log.d("tag" , "PICK_FROM_ALBUM > 4");
			intent.putExtra("output", mImageCaptureUri);
			startActivityForResult(intent, CROP_FROM_CAMERA);
	        break;
	      }
	      
	      case PICK_FROM_CAMERA:
	      {
	    	  
	    	  Log.d("tag" , "Start PICK_FROM_CAMERA");
	          // 만약 사용자가 촬영을 안했거나 다른 이유에 의해 인텐트가 예기치
	          // 않게 종료되었을 경우 아래의 과정을 무시한채 종료한다.
	          if (resultCode == RESULT_CANCELED) {
	        	  Log.d("tag" , "사진 가져오기 예기치않은 종료!");
	        	  return; 
	          }
	          // 넥서스S에서 Uri를 제대로 얻어오질 못하는데
	          // 이 부분을 수정하면 가능 할지도 모르리라 의심만 해본다.
	          // 우리가 찾고자 하는 마지막에 등록된 레코드가 있을 테이블이다.
	          Uri uriImages = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
	          int id = -1; //촬영된 이미지의 DB에서의 ID를 저장할 변수다.
	     
	          //아래는 DB의 해당 테이블에서 조건에 맞는 레코드의 어떤 필드값을
	          //불러올지를 지정하는 것이다.
	          //우리는 해당 레코드의 모든 필드값이 필요한 것이 아니기에 한정한다.
	          String[] IMAGE_PROJECTION = {
	              MediaStore.Images.ImageColumns.DATA, //데이터의 파일 절대 경로(문자열)
	              MediaStore.Images.ImageColumns._ID, //데이터의 테이블상의 아이디(정수)
	          };
	          Log.d("tag" , "PICK_FROM_CAMERA > 1");
	          try {
	              // 테이블에서 조건 없이 필드값을 한정해서 불러혼다. 그럼, 갤러리에 보이는
	              // 사진이 100개면 Cursor는 100번이나 움직일 수 있다.
	              Cursor cursorImages = getContentResolver().query(uriImages, IMAGE_PROJECTION, null, null,null);
	              // cursor가 무리없이 열렸고, 마지막으로 이동되었으면 경로를 얻어온다.
	              // (마지막 번째에 등록된 이미지의 실 경로를 불러온다는 말이다.
	              if (cursorImages != null && cursorImages.moveToLast()) {
	                  fromFile = new File(cursorImages.getString(0)); //이 것이 경로
	                  id = cursorImages.getInt(1); //이 것이 아이디
	                  //사실 아이디는 필요 없을지 모르지만, 본인같은 경우는 원본을
	                  //남기지 않기 때문에 이 아이디가 필요하다.
	                  cursorImages.close(); // 커서 사용이 끝나면 꼭 닫아준다.
	              }
	          } catch(Exception e) {
	              e.printStackTrace();
	          }
	          // 임시파일의 경로로서, 본인은 원본과 겹치지 않게 아래와 같이 작성하였다.
	          toFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + System.currentTimeMillis() + ".jpg");
	          Log.d("tag" , "PICK_FROM_CAMERA > 2");
	          try {
	              // 이 부분이 파일을 복사하는 부분이다.
	              // 이 부분이 없으면 CROP할 때 SK W폰에서 다른 이미지를 불러온다.
	              // 이유는 모르지만 원본이 소실되거나 DB에서 소실되는 지도 모르겠다.
	              inputStream = new FileInputStream(fromFile);
	              outputStream = new FileOutputStream(toFile);
	              FileChannel fcin = inputStream.getChannel();
	              FileChannel fcout = outputStream.getChannel();
	      
	              long size = fcin.size();
	      
	              fcin.transferTo(0, size, fcout);
	      
	              fcout.close();
	              fcin.close();
	              outputStream.close();
	              inputStream.close();
	          } catch (FileNotFoundException e) {
	              e.printStackTrace();
	          } catch (IOException e) {
	              e.printStackTrace();
	          }
	          Log.d("tag" , "PICK_FROM_CAMERA > 3");
	          // 그리고 원본은 지운다.
	          fromFile.delete();
	          // DB상에 남아있는 원본 레코드도 지운다. 그렇지 않으면 이미지의 존재기록이 
	          // 남아서 갤러리에 검은색 썸네일 또는 망가진 이미지 아이콘의 썸네일이 뜬다. 
	          // (미관상 안좋음)
	          getBaseContext().getContentResolver().delete(
	              MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
	              MediaStore.Images.ImageColumns._ID + "=" + id, 
	              null
	          );
	          Log.d("tag","원본파일사이즈:" + toFile.length());
	          // 임시파일 경로를 Uri로 변환한다.
	          
	          mImageCaptureUri = Uri.fromFile(toFile);
	          // 그리고 크롭을 실행한다.
	          Log.d("tag" , "PICK_FROM_CAMERA > 4");
	          intent = new Intent("com.android.camera.action.CROP");
	          intent.setDataAndType(mImageCaptureUri, "image/*");
	          intent.putExtra("scale", true);
	          // output의 경로가 임시파일과 같기 때문에 잘린 이미지는 임시파일에 
	          // 덮어쓰이게 되겠다.
	          Log.d("tag" , "PICK_FROM_CAMERA > 5");
	          intent.putExtra("output", mImageCaptureUri);
	          // CROP역시 클래스 내에서 임의로 만든 상수이다.
	          startActivityForResult(intent, CROP_FROM_CAMERA);
	        break;
	      }
	    }
	  }

	private void HttpFileUpload(String urlString, String params, String filepath) {
		try {
			
			FileInputStream mFileInputStream = new FileInputStream(filepath);		
			URL connectUrl = new URL(urlString);
			Log.d("Test", "mFileInputStream  is " + mFileInputStream);
			String boundary = "*****";	
			String lineEnd = "\r\n";
			String twoHyphens = "--";
			
			// open connection 
			HttpURLConnection conn = (HttpURLConnection)connectUrl.openConnection();			
			conn.setDoInput(true);
			conn.setDoOutput(true);
			conn.setUseCaches(false);
			conn.setRequestMethod("POST");
			conn.setRequestProperty("Connection", "Keep-Alive");
			conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
			
			// write data
			DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
			dos.writeBytes(twoHyphens + boundary + lineEnd);
			dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + filepath +"\"" + lineEnd);
			dos.writeBytes(lineEnd);
			
			int bytesAvailable = mFileInputStream.available();
			int maxBufferSize = 1024;
			int bufferSize = Math.min(bytesAvailable, maxBufferSize);
			
			byte[] buffer = new byte[bufferSize];
			int bytesRead = mFileInputStream.read(buffer, 0, bufferSize);
			
			Log.d("tag", "image byte is " + bytesRead);
			
			// read image
			while (bytesRead > 0) {
				dos.write(buffer, 0, bufferSize);
				bytesAvailable = mFileInputStream.available();
				bufferSize = Math.min(bytesAvailable, maxBufferSize);
				bytesRead = mFileInputStream.read(buffer, 0, bufferSize);
			}	
			
			dos.writeBytes(lineEnd);
			dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
			
			// close streams
			Log.d("tag" , "File is written");
			mFileInputStream.close();
			dos.flush(); // finish upload...			
			
			// get response
			int ch;
			InputStream is = conn.getInputStream();
			StringBuffer b =new StringBuffer();
			while( ( ch = is.read() ) != -1 ){
				b.append( (char)ch );
			}
			String s=b.toString(); 
			Log.d("tag", "result = " + s);
			dos.close();
			
		} catch (Exception e) {
			Log.d("Test", "exception " + e.getMessage());
			// TODO: handle exception
		}		
	}
	
	private void SaveBitmapToFileCache(Bitmap bitmap, String strFilePath,int quality) {
		File fileCacheItem = new File(strFilePath);
		OutputStream out = null;
		try {
			fileCacheItem.createNewFile();
			out = new FileOutputStream(fileCacheItem);
			bitmap.compress(CompressFormat.JPEG, quality, out);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			Log.d("tag","별도이미지저장성공!");
			try {
				out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	//사진 업로드 시 재 다운로드 없이 폰 내부 이미지로 바로 뷰에 세팅하기
	private void setPhotoScreenDirect(int photoOrder,Uri photoUri) {
		switch (photoOrder) {
		case 1:
			v_photo_01.setImageURI(null);
	    	v_photo_01.setImageURI(photoUri);
	    	editor.putString("photo_url1", "Y");
	    	editor.commit();
    		v_btn_change_photo_01.setText("기본사진 변경");
    		v_btn_change_photo_01.setBackgroundResource(R.drawable.btn_userinfo_album_edit_photo);
			break;
		case 2:
			v_photo_02.setImageURI(null);
			v_photo_02.setImageURI(photoUri);
			editor.putString("photo_url2", "Y");
			editor.commit();
    		v_btn_change_photo_02.setText("사진 변경");
    		v_btn_change_photo_02.setBackgroundResource(R.drawable.btn_userinfo_album_edit_photo);
			break;
		case 3:
			v_photo_03.setImageURI(null);
			v_photo_03.setImageURI(photoUri);
			editor.putString("photo_url3", "Y");
			editor.commit();
			v_btn_change_photo_03.setText("사진 변경");
			v_btn_change_photo_03.setBackgroundResource(R.drawable.btn_userinfo_album_edit_photo);
			break;
		case 4:
			v_photo_04.setImageURI(null);
			v_photo_04.setImageURI(photoUri);
			editor.putString("photo_url4", "Y");
			editor.commit();
			v_btn_change_photo_04.setText("사진 변경");
			v_btn_change_photo_04.setBackgroundResource(R.drawable.btn_userinfo_album_edit_photo);
			break;
		}
	}
	
	
    private void showGetPhotoDialog() {
    	final String[] items = {"직접 촬영하기","앨범에서 선택","취소"};
    	
    	AlertDialog.Builder alert = new AlertDialog.Builder(this);
    	alert.setTitle("사진 변경하기");
    	alert.setItems(items, new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				switch (which) {
				case 0:
					doTakePhotoAction();
					break;
				case 1:
					doTakeAlbumAction();
					break;
				case 2: 
					dialog.dismiss();
					break;
				}
			}
		});
    	alert.show();
    }
    
    private boolean updatePhotoYnFromDB(int photoNum) {
    	try {
			//서버에 정보 보내기
			StringBuffer url = new StringBuffer(LovetoConstant.USERINFO_UPDATE_PHOTO_YN);
			url.append("?memberid=").append(memberid).append("&photo_num=").append(photoNum);
			Log.d("tag", "url : " + url.toString());
			String jsonText = JsonUtils.getStringFromUrl(url.toString());
			Log.d("tag", "jsonText : " + jsonText);
			//JSONArray jsonArray = new JSONArray(jsonText);
			JSONObject object = new JSONObject(jsonText);
			String result = object.getString("result");
			String err = object.getString("err");
			Log.d("tag", "result : " + result);
			Log.d("tag", "err : " + err);
			if (!"F".equals(result)) {
				SharedPreferences pref = getSharedPreferences("userInfo", Activity.MODE_PRIVATE);
				Editor editor = pref.edit();
				switch (photoNum) {
				case 1:
					editor.putString("photo_url1", "Y");
					break;
				case 2:
					editor.putString("photo_url2", "Y");
					break;
				case 3:
					editor.putString("photo_url3", "Y");
					break;
				case 4:
					editor.putString("photo_url4", "Y");
					break;
				}
				editor.commit();
			}
		} catch (JSONException e) {
			e.printStackTrace();
			Log.d("tag", "updatePhotoYnFromDB() error, " + e.getMessage());
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
			Log.d("tag", "updatePhotoYnFromDB() error, " + e.getMessage());
		}
    	return true; 
    }
    
    private void getPhotoFromServer() {
    	progressDialog.setMessage("사진을 불러오고있습니다.");
    	progressDialog.show();
		new Thread(new Runnable(){
			@Override
			public void run() {
				//UI 를 건들기 때문에 핸들러 사용.
				myHandler.post(new Runnable() {
					@Override
					public void run() {
				    	String photo_url1_yn = pref.getString("photo_url1", "");
				    	String photo_url2_yn = pref.getString("photo_url2", "");
				    	String photo_url3_yn = pref.getString("photo_url3", "");
				    	String photo_url4_yn = pref.getString("photo_url4", "");
				    	String photoUrl;
				    	ImageDownloader imageDownloader = new ImageDownloader();
				    	if ("Y".equals(photo_url1_yn)) {
				    		//버튼 변경
				    		v_btn_change_photo_01.setText("기본사진 변경");
				    		v_btn_change_photo_01.setBackgroundResource(R.drawable.btn_userinfo_album_edit_photo);
				    		//사진 변경
				    		photoUrl = LovetoConstant.PHOTO_URL + memberid + "_1.jpg";
							imageDownloader.download(photoUrl, v_photo_01);
				    	} else {
				    		v_btn_change_photo_01.setText("기본사진 등록");
				    		v_photo_01.setScaleType(ScaleType.CENTER);
				    		v_photo_01.setImageResource(R.drawable.icon_userinfo_addphoto);
				    	}
				    	if ("Y".equals(photo_url2_yn)) {
				    		//버튼 변경
				    		v_btn_change_photo_02.setText("사진 변경");
				    		v_btn_change_photo_02.setBackgroundResource(R.drawable.btn_userinfo_album_edit_photo);
				    		//사진 변경
				    		photoUrl = LovetoConstant.PHOTO_URL + memberid + "_2.jpg";
				    		imageDownloader.download(photoUrl, v_photo_02);
				    	} else {
				    		v_btn_change_photo_02.setText("사진 등록");
				    		v_photo_02.setScaleType(ScaleType.CENTER);
				    		v_photo_02.setImageResource(R.drawable.icon_userinfo_addphoto);
				    	}
				    	if ("Y".equals(photo_url3_yn)) {
				    		//버튼 변경
				    		v_btn_change_photo_03.setText("사진 변경");
				    		v_btn_change_photo_03.setBackgroundResource(R.drawable.btn_userinfo_album_edit_photo);
				    		//사진 변경
				    		photoUrl = LovetoConstant.PHOTO_URL + memberid + "_3.jpg";
				    		imageDownloader.download(photoUrl, v_photo_03);
				    	} else {
				    		v_btn_change_photo_03.setText("사진 등록");
				    		v_photo_03.setScaleType(ScaleType.CENTER);
				    		v_photo_03.setImageResource(R.drawable.icon_userinfo_addphoto);
				    	}
				    	if ("Y".equals(photo_url4_yn)) {
				    		//버튼 변경
				    		v_btn_change_photo_04.setText("사진 변경");
				    		v_btn_change_photo_04.setBackgroundResource(R.drawable.btn_userinfo_album_edit_photo);
				    		//사진 변경
				    		photoUrl = LovetoConstant.PHOTO_URL + memberid + "_4.jpg";
				    		imageDownloader.download(photoUrl, v_photo_04);
				    	} else {
				    		v_btn_change_photo_04.setText("사진 등록");
				    		v_photo_04.setScaleType(ScaleType.CENTER);
				    		v_photo_04.setImageResource(R.drawable.icon_userinfo_addphoto);
				    	}
				    	progressDialog.dismiss();
					}
				});
			}
		}).start();
    }
    
    /*기기별 특성타는 케이스 정리 (인터넷에서 발견한)
     * 카메라 찍은 후 DB 저장한 파일의 Uri(주소)나 Bitmap 전달이 기종마다 다름. 
     * cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)); <- EXTRA_OUTPUT에  URI를 주는 방식은 단말마다 다르게 동작하는것이 맞구요...
     * EXTRA OUTPUT 사용시 갤S의 경우는 같은 이미지 중복 저장이 일어나며,
     *  Bitmap으로 받아올 경우 썸네일을 반환하는 기기가 있고, (옵티머스Z는 섬네일이 넘어옵니다.)
     * DB 첫번째 값 읽는 방식의 문제(현재) : 넥서스S : 촬영후 자르기 시 다른 이미지가 들어옴,아트릭스 : 촬영후 자르기를 하면 촬영한 사진이 방향보정이 되어있지 않고, 앱을 끄고 보면 런처의 배경화면이 촬영한 사진으로 바뀌어 있음.
     * File file = new File(Environment.getExternalStorageDirectory(), "picture.jpg")
		SD카드 경로 지정할때는 getExternalStorageDirectory()를 이용하시는 것을 추천합니다.
		/sdcard/ 형태일때 일부 단말에서 이미지를 갤러리에서 불러올때 속도가 아주 느린 경우가 있습니다.
     */
    
    
}
